package top.xia17.plugins.fast.common.utils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 树的一个节点
 * @author xia17
 * @date 2020-01-14
 * @param <T> 节点
 * @param <K> 节点编号
 */
public interface TreeNode<T extends TreeNode<T,K>,K> {

    /**
     * 写入子节点
     * @param children 子节点
     */
    void setChildrenNodes(List<T> children);

    /**
     * 获取子节点
     * @return /
     */
    List<T> getChildrenNodes();

    /**
     * 获取该节点的父节点编号
     * @return /
     */
    K getParentNodeId();

    /**
     * 获取该节点的编号
     * @return /
     */
    K getNodeId();

    /**
     * 判断一个节点是不是自己的子节点
     * @param node 节点
     * @return 是 true 反之false
     */
    default boolean isChildren(TreeNode<T, K> node){
        return this.getNodeId().equals(node.getParentNodeId());
    }

    /**
     * 判断一个节点是不是自己的父节点
     * @param node 节点
     * @return 是 true 反之false
     */
    default boolean isParent(TreeNode<T, K> node){
        return this.getParentNodeId().equals(node.getNodeId());
    }

    /**
     * 从数据源中获取自己的子节点
     * @param list 数据源
     * @return /
     */
    default List<T> findChildren(List<T> list){
        return list.stream().filter(this::isChildren).collect(Collectors.toList());
    }

    /**
     * 从数据源中获取自己的子节点 并直接写入子节点
     * @param list 数据源
     */
    default void findAndSetChildren(List<T> list){
        this.setChildrenNodes(findChildren(list));
    }

    /**
     * 是不是父节点 通过父节点是不是null 来判断
     * @return /
     */
    default boolean isRootByParentIsNull(){
        return this.getParentNodeId() == null;
    }

    /**
     * 是不是父节点 通过从数据源中是否找到父节点来判断
     * @param list 数据源
     * @return /
     */
    default boolean isRootByNotFindPatent(List<T> list){
        return list.stream().anyMatch(this::isParent);
    }




}